home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / idlelib / IOBinding.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  17KB  |  612 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import os
  5. import types
  6. import sys
  7. import codecs
  8. import tempfile
  9. import tkFileDialog
  10. import tkMessageBox
  11. import re
  12. from Tkinter import *
  13. from SimpleDialog import SimpleDialog
  14. from configHandler import idleConf
  15.  
  16. try:
  17.     from codecs import BOM_UTF8
  18. except ImportError:
  19.     BOM_UTF8 = '\xef\xbb\xbf'
  20.  
  21.  
  22. try:
  23.     import locale
  24.     locale.setlocale(locale.LC_CTYPE, '')
  25. except (ImportError, locale.Error):
  26.     pass
  27.  
  28. filesystemencoding = sys.getfilesystemencoding()
  29. encoding = 'ascii'
  30. if sys.platform == 'win32':
  31.     
  32.     try:
  33.         encoding = locale.getdefaultlocale()[1]
  34.         codecs.lookup(encoding)
  35.     except LookupError:
  36.         pass
  37.  
  38. else:
  39.     
  40.     try:
  41.         encoding = locale.nl_langinfo(locale.CODESET)
  42.         if encoding is None or encoding is '':
  43.             encoding = 'ascii'
  44.         
  45.         codecs.lookup(encoding)
  46.     except (NameError, AttributeError, LookupError):
  47.         
  48.         try:
  49.             encoding = locale.getdefaultlocale()[1]
  50.             if encoding is None or encoding is '':
  51.                 encoding = 'ascii'
  52.             
  53.             codecs.lookup(encoding)
  54.         except (ValueError, LookupError):
  55.             pass
  56.  
  57.  
  58. encoding = encoding.lower()
  59. coding_re = re.compile('coding[:=]\\s*([-\\w_.]+)')
  60.  
  61. class EncodingMessage(SimpleDialog):
  62.     '''Inform user that an encoding declaration is needed.'''
  63.     
  64.     def __init__(self, master, enc):
  65.         self.should_edit = False
  66.         self.root = top = Toplevel(master)
  67.         top.bind('<Return>', self.return_event)
  68.         top.bind('<Escape>', self.do_ok)
  69.         top.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
  70.         top.wm_title('I/O Warning')
  71.         top.wm_iconname('I/O Warning')
  72.         self.top = top
  73.         l1 = Label(top, text = 'Non-ASCII found, yet no encoding declared. Add a line like')
  74.         l1.pack(side = TOP, anchor = W)
  75.         l2 = Entry(top, font = 'courier')
  76.         l2.insert(0, '# -*- coding: %s -*-' % enc)
  77.         l2.pack(side = TOP, anchor = W, fill = X)
  78.         l3 = Label(top, text = 'to your file\nChoose OK to save this file as %s\nEdit your general options to silence this warning' % enc)
  79.         l3.pack(side = TOP, anchor = W)
  80.         buttons = Frame(top)
  81.         buttons.pack(side = TOP, fill = X)
  82.         self.default = self.cancel = 0
  83.         b1 = Button(buttons, text = 'Ok', default = 'active', command = self.do_ok)
  84.         b1.pack(side = LEFT, fill = BOTH, expand = 1)
  85.         b2 = Button(buttons, text = 'Edit my file', command = self.do_edit)
  86.         b2.pack(side = LEFT, fill = BOTH, expand = 1)
  87.         self._set_transient(master)
  88.  
  89.     
  90.     def do_ok(self):
  91.         self.done(0)
  92.  
  93.     
  94.     def do_edit(self):
  95.         self.done(1)
  96.  
  97.  
  98.  
  99. def coding_spec(str):
  100.     '''Return the encoding declaration according to PEP 263.
  101.  
  102.     Raise LookupError if the encoding is declared but unknown.
  103.     '''
  104.     str = str.split('\n')[:2]
  105.     str = '\n'.join(str)
  106.     match = coding_re.search(str)
  107.     if not match:
  108.         return None
  109.     
  110.     name = match.group(1)
  111.     import codecs as codecs
  112.     
  113.     try:
  114.         codecs.lookup(name)
  115.     except LookupError:
  116.         raise LookupError, 'Unknown encoding ' + name
  117.  
  118.     return name
  119.  
  120.  
  121. class IOBinding:
  122.     
  123.     def __init__(self, editwin):
  124.         self.editwin = editwin
  125.         self.text = editwin.text
  126.         self._IOBinding__id_open = self.text.bind('<<open-window-from-file>>', self.open)
  127.         self._IOBinding__id_save = self.text.bind('<<save-window>>', self.save)
  128.         self._IOBinding__id_saveas = self.text.bind('<<save-window-as-file>>', self.save_as)
  129.         self._IOBinding__id_savecopy = self.text.bind('<<save-copy-of-window-as-file>>', self.save_a_copy)
  130.         self.fileencoding = None
  131.         self._IOBinding__id_print = self.text.bind('<<print-window>>', self.print_window)
  132.  
  133.     
  134.     def close(self):
  135.         self.text.unbind('<<open-window-from-file>>', self._IOBinding__id_open)
  136.         self.text.unbind('<<save-window>>', self._IOBinding__id_save)
  137.         self.text.unbind('<<save-window-as-file>>', self._IOBinding__id_saveas)
  138.         self.text.unbind('<<save-copy-of-window-as-file>>', self._IOBinding__id_savecopy)
  139.         self.text.unbind('<<print-window>>', self._IOBinding__id_print)
  140.         self.editwin = None
  141.         self.text = None
  142.         self.filename_change_hook = None
  143.  
  144.     
  145.     def get_saved(self):
  146.         return self.editwin.get_saved()
  147.  
  148.     
  149.     def set_saved(self, flag):
  150.         self.editwin.set_saved(flag)
  151.  
  152.     
  153.     def reset_undo(self):
  154.         self.editwin.reset_undo()
  155.  
  156.     filename_change_hook = None
  157.     
  158.     def set_filename_change_hook(self, hook):
  159.         self.filename_change_hook = hook
  160.  
  161.     filename = None
  162.     dirname = None
  163.     
  164.     def set_filename(self, filename):
  165.         if filename and os.path.isdir(filename):
  166.             self.filename = None
  167.             self.dirname = filename
  168.         else:
  169.             self.filename = filename
  170.             self.dirname = None
  171.             self.set_saved(1)
  172.             if self.filename_change_hook:
  173.                 self.filename_change_hook()
  174.             
  175.  
  176.     
  177.     def open(self, event = None, editFile = None):
  178.         if self.editwin.flist:
  179.             if not editFile:
  180.                 filename = self.askopenfile()
  181.             else:
  182.                 filename = editFile
  183.             if filename:
  184.                 
  185.                 try:
  186.                     interp = self.editwin.interp
  187.                 except:
  188.                     interp = None
  189.  
  190.                 if not (self.filename) and self.get_saved() and not interp:
  191.                     self.editwin.flist.open(filename, self.loadfile)
  192.                 else:
  193.                     self.editwin.flist.open(filename)
  194.             else:
  195.                 self.text.focus_set()
  196.             return 'break'
  197.         
  198.         if self.get_saved():
  199.             reply = self.maybesave()
  200.             if reply == 'cancel':
  201.                 self.text.focus_set()
  202.                 return 'break'
  203.             
  204.         
  205.         if not editFile:
  206.             filename = self.askopenfile()
  207.         else:
  208.             filename = editFile
  209.         if filename:
  210.             self.loadfile(filename)
  211.         else:
  212.             self.text.focus_set()
  213.         return 'break'
  214.  
  215.     eol = '(\\r\\n)|\\n|\\r'
  216.     eol_re = re.compile(eol)
  217.     eol_convention = os.linesep
  218.     
  219.     def loadfile(self, filename):
  220.         
  221.         try:
  222.             f = open(filename, 'rb')
  223.             chars = f.read()
  224.             f.close()
  225.         except IOError:
  226.             msg = None
  227.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  228.             return False
  229.  
  230.         chars = self.decode(chars)
  231.         firsteol = self.eol_re.search(chars)
  232.         if firsteol:
  233.             self.eol_convention = firsteol.group(0)
  234.             if isinstance(self.eol_convention, unicode):
  235.                 self.eol_convention = self.eol_convention.encode('ascii')
  236.             
  237.             chars = self.eol_re.sub('\\n', chars)
  238.         
  239.         self.text.delete('1.0', 'end')
  240.         self.set_filename(None)
  241.         self.text.insert('1.0', chars)
  242.         self.reset_undo()
  243.         self.set_filename(filename)
  244.         self.text.mark_set('insert', '1.0')
  245.         self.text.see('insert')
  246.         self.updaterecentfileslist(filename)
  247.         return True
  248.  
  249.     
  250.     def decode(self, chars):
  251.         '''Create a Unicode string
  252.  
  253.         If that fails, let Tcl try its best
  254.         '''
  255.         if chars.startswith(BOM_UTF8):
  256.             
  257.             try:
  258.                 chars = chars[3:].decode('utf-8')
  259.             except UnicodeError:
  260.                 return chars
  261.  
  262.             self.fileencoding = BOM_UTF8
  263.             return chars
  264.         
  265.         
  266.         try:
  267.             enc = coding_spec(chars)
  268.         except LookupError:
  269.             name = None
  270.             tkMessageBox.showerror(title = 'Error loading the file', message = "The encoding '%s' is not known to this Python installation. The file may not display correctly" % name, master = self.text)
  271.             enc = None
  272.  
  273.         if enc:
  274.             
  275.             try:
  276.                 return unicode(chars, enc)
  277.             except UnicodeError:
  278.                 pass
  279.             except:
  280.                 None<EXCEPTION MATCH>UnicodeError
  281.             
  282.  
  283.         None<EXCEPTION MATCH>UnicodeError
  284.         
  285.         try:
  286.             return unicode(chars, 'ascii')
  287.         except UnicodeError:
  288.             pass
  289.  
  290.         
  291.         try:
  292.             chars = unicode(chars, encoding)
  293.             self.fileencoding = encoding
  294.         except UnicodeError:
  295.             pass
  296.  
  297.         return chars
  298.  
  299.     
  300.     def maybesave(self):
  301.         if self.get_saved():
  302.             return 'yes'
  303.         
  304.         if not self.filename:
  305.             pass
  306.         message = 'Do you want to save %s before closing?' % 'this untitled document'
  307.         m = tkMessageBox.Message(title = 'Save On Close', message = message, icon = tkMessageBox.QUESTION, type = tkMessageBox.YESNOCANCEL, master = self.text)
  308.         reply = m.show()
  309.         if reply == 'yes':
  310.             self.save(None)
  311.             if not self.get_saved():
  312.                 reply = 'cancel'
  313.             
  314.         
  315.         self.text.focus_set()
  316.         return reply
  317.  
  318.     
  319.     def save(self, event):
  320.         None if not self.filename else None<EXCEPTION MATCH>AttributeError
  321.         self.text.focus_set()
  322.         return 'break'
  323.  
  324.     
  325.     def save_as(self, event):
  326.         filename = self.asksavefile()
  327.         if filename:
  328.             if self.writefile(filename):
  329.                 self.set_filename(filename)
  330.                 self.set_saved(1)
  331.                 
  332.                 try:
  333.                     self.editwin.store_file_breaks()
  334.                 except AttributeError:
  335.                     pass
  336.                 except:
  337.                     None<EXCEPTION MATCH>AttributeError
  338.                 
  339.  
  340.             None<EXCEPTION MATCH>AttributeError
  341.         
  342.         self.text.focus_set()
  343.         self.updaterecentfileslist(filename)
  344.         return 'break'
  345.  
  346.     
  347.     def save_a_copy(self, event):
  348.         filename = self.asksavefile()
  349.         if filename:
  350.             self.writefile(filename)
  351.         
  352.         self.text.focus_set()
  353.         self.updaterecentfileslist(filename)
  354.         return 'break'
  355.  
  356.     
  357.     def writefile(self, filename):
  358.         self.fixlastline()
  359.         chars = self.encode(self.text.get('1.0', 'end-1c'))
  360.         if self.eol_convention != '\n':
  361.             chars = chars.replace('\n', self.eol_convention)
  362.         
  363.         
  364.         try:
  365.             f = open(filename, 'wb')
  366.             f.write(chars)
  367.             f.flush()
  368.             f.close()
  369.             return True
  370.         except IOError:
  371.             msg = None
  372.             tkMessageBox.showerror('I/O Error', str(msg), master = self.text)
  373.             return False
  374.  
  375.  
  376.     
  377.     def encode(self, chars):
  378.         if isinstance(chars, types.StringType):
  379.             return chars
  380.         
  381.         
  382.         try:
  383.             return chars.encode('ascii')
  384.         except UnicodeError:
  385.             pass
  386.  
  387.         
  388.         try:
  389.             enc = coding_spec(chars)
  390.             failed = None
  391.         except LookupError:
  392.             msg = None
  393.             failed = msg
  394.             enc = None
  395.  
  396.         if enc:
  397.             
  398.             try:
  399.                 return chars.encode(enc)
  400.             except UnicodeError:
  401.                 failed = "Invalid encoding '%s'" % enc
  402.             except:
  403.                 None<EXCEPTION MATCH>UnicodeError
  404.             
  405.  
  406.         None<EXCEPTION MATCH>UnicodeError
  407.         if failed:
  408.             tkMessageBox.showerror('I/O Error', '%s. Saving as UTF-8' % failed, master = self.text)
  409.         
  410.         if self.fileencoding == BOM_UTF8 or failed:
  411.             return BOM_UTF8 + chars.encode('utf-8')
  412.         
  413.         if self.fileencoding:
  414.             
  415.             try:
  416.                 return chars.encode(self.fileencoding)
  417.             except UnicodeError:
  418.                 tkMessageBox.showerror('I/O Error', "Cannot save this as '%s' anymore. Saving as UTF-8" % self.fileencoding, master = self.text)
  419.                 return BOM_UTF8 + chars.encode('utf-8')
  420.             except:
  421.                 None<EXCEPTION MATCH>UnicodeError
  422.             
  423.  
  424.         None<EXCEPTION MATCH>UnicodeError
  425.         config_encoding = idleConf.GetOption('main', 'EditorWindow', 'encoding')
  426.         if config_encoding == 'utf-8':
  427.             return BOM_UTF8 + chars.encode('utf-8')
  428.         
  429.         ask_user = True
  430.         
  431.         try:
  432.             chars = chars.encode(encoding)
  433.             enc = encoding
  434.             if config_encoding == 'locale':
  435.                 ask_user = False
  436.         except UnicodeError:
  437.             chars = BOM_UTF8 + chars.encode('utf-8')
  438.             enc = 'utf-8'
  439.  
  440.         if not ask_user:
  441.             return chars
  442.         
  443.         dialog = EncodingMessage(self.editwin.top, enc)
  444.         dialog.go()
  445.         if dialog.num == 1:
  446.             encline = '# -*- coding: %s -*-\n' % enc
  447.             firstline = self.text.get('1.0', '2.0')
  448.             if firstline.startswith('#!'):
  449.                 self.text.insert('2.0', encline)
  450.             else:
  451.                 self.text.insert('1.0', encline)
  452.             return self.encode(self.text.get('1.0', 'end-1c'))
  453.         
  454.         return chars
  455.  
  456.     
  457.     def fixlastline(self):
  458.         c = self.text.get('end-2c')
  459.         if c != '\n':
  460.             self.text.insert('end-1c', '\n')
  461.         
  462.  
  463.     
  464.     def print_window(self, event):
  465.         tempfilename = None
  466.         saved = self.get_saved()
  467.         if saved:
  468.             filename = self.filename
  469.         
  470.         if not saved or filename is None:
  471.             (tfd, tempfilename) = tempfile.mkstemp(prefix = 'IDLE_tmp_')
  472.             filename = tempfilename
  473.             os.close(tfd)
  474.             if not self.writefile(tempfilename):
  475.                 os.unlink(tempfilename)
  476.                 return 'break'
  477.             
  478.         
  479.         platform = os.name
  480.         printPlatform = 1
  481.         if platform == 'posix':
  482.             command = idleConf.GetOption('main', 'General', 'print-command-posix')
  483.             command = command + ' 2>&1'
  484.         elif platform == 'nt':
  485.             command = idleConf.GetOption('main', 'General', 'print-command-win')
  486.         else:
  487.             printPlatform = 0
  488.         if printPlatform:
  489.             command = command % filename
  490.             pipe = os.popen(command, 'r')
  491.             output = pipe.read().strip()
  492.             status = pipe.close()
  493.             if status:
  494.                 output = 'Printing failed (exit status 0x%x)\n' % status + output
  495.             
  496.             if output:
  497.                 output = 'Printing command: %s\n' % repr(command) + output
  498.                 tkMessageBox.showerror('Print status', output, master = self.text)
  499.             
  500.         else:
  501.             message = 'Printing is not enabled for this platform: %s' % platform
  502.             tkMessageBox.showinfo('Print status', message, master = self.text)
  503.         if tempfilename:
  504.             os.unlink(tempfilename)
  505.         
  506.         return 'break'
  507.  
  508.     opendialog = None
  509.     savedialog = None
  510.     filetypes = [
  511.         ('Python and text files', '*.py *.pyw *.txt', 'TEXT'),
  512.         ('All text files', '*', 'TEXT'),
  513.         ('All files', '*')]
  514.     
  515.     def askopenfile(self):
  516.         (dir, base) = self.defaultfilename('open')
  517.         if not self.opendialog:
  518.             self.opendialog = tkFileDialog.Open(master = self.text, filetypes = self.filetypes)
  519.         
  520.         filename = self.opendialog.show(initialdir = dir, initialfile = base)
  521.         if isinstance(filename, unicode):
  522.             filename = filename.encode(filesystemencoding)
  523.         
  524.         return filename
  525.  
  526.     
  527.     def defaultfilename(self, mode = 'open'):
  528.         if self.filename:
  529.             return os.path.split(self.filename)
  530.         elif self.dirname:
  531.             return (self.dirname, '')
  532.         else:
  533.             
  534.             try:
  535.                 pwd = os.getcwd()
  536.             except os.error:
  537.                 pwd = ''
  538.  
  539.             return (pwd, '')
  540.  
  541.     
  542.     def asksavefile(self):
  543.         (dir, base) = self.defaultfilename('save')
  544.         if not self.savedialog:
  545.             self.savedialog = tkFileDialog.SaveAs(master = self.text, filetypes = self.filetypes)
  546.         
  547.         filename = self.savedialog.show(initialdir = dir, initialfile = base)
  548.         if isinstance(filename, unicode):
  549.             filename = filename.encode(filesystemencoding)
  550.         
  551.         return filename
  552.  
  553.     
  554.     def updaterecentfileslist(self, filename):
  555.         '''Update recent file list on all editor windows'''
  556.         self.editwin.update_recent_files_list(filename)
  557.  
  558.  
  559.  
  560. def test():
  561.     root = Tk()
  562.     
  563.     class MyEditWin:
  564.         
  565.         def __init__(self, text):
  566.             self.text = text
  567.             self.flist = None
  568.             self.text.bind('<Control-o>', self.open)
  569.             self.text.bind('<Control-s>', self.save)
  570.             self.text.bind('<Alt-s>', self.save_as)
  571.             self.text.bind('<Alt-z>', self.save_a_copy)
  572.  
  573.         
  574.         def get_saved(self):
  575.             return 0
  576.  
  577.         
  578.         def set_saved(self, flag):
  579.             pass
  580.  
  581.         
  582.         def reset_undo(self):
  583.             pass
  584.  
  585.         
  586.         def open(self, event):
  587.             self.text.event_generate('<<open-window-from-file>>')
  588.  
  589.         
  590.         def save(self, event):
  591.             self.text.event_generate('<<save-window>>')
  592.  
  593.         
  594.         def save_as(self, event):
  595.             self.text.event_generate('<<save-window-as-file>>')
  596.  
  597.         
  598.         def save_a_copy(self, event):
  599.             self.text.event_generate('<<save-copy-of-window-as-file>>')
  600.  
  601.  
  602.     text = Text(root)
  603.     text.pack()
  604.     text.focus_set()
  605.     editwin = MyEditWin(text)
  606.     io = IOBinding(editwin)
  607.     root.mainloop()
  608.  
  609. if __name__ == '__main__':
  610.     test()
  611.  
  612.